home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 January / PCWorld_2007-01_cd.bin / v cisle / autoit / autoit-v3.2.0.1-setup.exe / Include / Visa.au3 < prev    next >
Text File  |  2006-07-22  |  69KB  |  1,334 lines

  1. ; Include Version:1.66 (17 July 2006)
  2. #include-once
  3.  
  4. ; ------------------------------------------------------------------------------
  5. ;
  6. ; AutoIt Version: 3.0
  7. ; Language:       English
  8. ; Description:    VISA (GPIB & TCP) library for AutoIt
  9. ;                 Functions that allow controlling instruments (e.g. oscilloscopes,
  10. ;                 signal generators, spectrum analyzers, power supplies, etc)
  11. ;                 that have a GPIB or Ethernet port through the VISA interface
  12. ;                 (GPIB, TCP or Serial Interface)
  13. ; Limitations:    The VISA queries only return the 1st line of the device answer
  14. ;                 This is not a problem in most cases, as most devices will always
  15. ;                 answer with a single line.
  16. ; Notes:
  17. ;                 If you are interested in this library you probably already know 
  18. ;                 what is VISA and GPIB, but here there is a short description 
  19. ;                 for those that don't know about it:
  20. ;
  21. ;                 Basically GPIB allows you to control instruments like Power 
  22. ;                 Supplies, Signal Generators, Oscilloscopes, Signal Generators, etc.
  23. ;                 You need to install or connect a GPIB interface card (PCI, PCMCIA
  24. ;                 or USB) to your PC and install the corresponding GPIB driver.
  25. ;
  26. ;                 VISA is a standard API that sits on top of the GPIB driver and
  27. ;                 it allows you to use the same programs to control your 
  28. ;                 instruments regardless of the type of GPIB card that you have 
  29. ;                 installed in your PC (most cards are made either by National 
  30. ;                 Instruments(R) or by Agilent/Hewlett-Packard(R)).
  31. ;
  32. ;                 This library is that it opens AutoIt to a different kind of 
  33. ;                 automation (instrument automation). Normally you would need to
  34. ;                 use some expensive "instrumentation" environment like 
  35. ;                 Labwindows/CVI (TM), LabView (TM) or Matlab (TM) to automate 
  36. ;                 instruments but now you can do so with AutoIt.
  37. ;                 The only requirement is that you need a VISA compatible GPIB 
  38. ;                 card (all cards that I know are) and the corresponding VISA 
  39. ;                 driver must be installed (look for visa32.dll in the 
  40. ;                 windows\system32 folder).
  41. ;
  42. ;                 Basically you have 4 main functions:
  43. ;                 _viExecCommand - Executes commands and queries through GPIB
  44. ;                 _viOpen, _viClose - Open/Close a connection to a GPIB instrument.
  45. ;                 _viFindGpib - Find all the instruments in the GPIB bus
  46. ;
  47. ;                 There are other less important functions, like:
  48. ;                 _viGTL - Go to local mode (exeit the "remote control mode")
  49. ;                 _viGpibBusReset - Reset the GPIB bus if it is in a bad state
  50. ;                 _viSetTimeout - Sets the GPIB Query timeout
  51. ;                 _viSetAttribute - Set any VISA attribute
  52. ;
  53. ;                 There is one known limitation of this library:
  54. ;                 - The GPIB queries do not support binary transfer.
  55. ;
  56. ;                 It is recommended that you try first to execute the _viFindGpib 
  57. ;                 function (as shown in the example in the _viFindGpib header)
  58. ;                 and see if you can find any instruments. You can also have a 
  59. ;                 look at the examples in the _viExecCommand function description.
  60. ;
  61. ; ==============================================================================
  62. ; VERSION       DATE       DESCRIPTION
  63. ; -------    ----------    -----------------------------------------------------
  64. ; v1.0.00    02/01/2005    Initial release
  65. ; v1.0.01    02/06/2005    Formatted according to Standard UDF rules
  66. ;                          Fixed _viGpibBusReset
  67. ;                          Renamed _viFindGPIB to _viFindGpib
  68. ;                          Removed unnecessary MsgBox calls
  69. ;                          More detailed function headers
  70. ;                          Added Serial Interface related Attribute/Value Constants
  71. ; v1.0.02    02/11/2005    Fixed _viQueryf only executing "*IDN?" queries
  72. ;                          Fixed _viQueryf only returning characters up to the first space
  73. ;                          Fixed _viQuertf returning only first line of answer
  74. ;                          Added _viInterativeControl for interactive VISA control
  75. ;                          Added GPIB message termination attributes
  76. ; ------------------------------------------------------------------------------
  77.  
  78.  
  79. ; ==============================================================================
  80. ;- VISA Definitions ------------------------------------------------------------
  81. ; The VISA library requires some GLOBAL CONSTANTS and VARIABLES that are defined
  82. ; here:
  83.  
  84. ;- VISA CONSTANTS -------------------------------------------------------------
  85.  
  86. Global Const $VI_SUCCESS = 0 ; (0L)
  87. Global Const $VI_NULL = 0
  88.  
  89. Global Const $VI_TRUE = 1
  90. Global Const $VI_FALSE = 0
  91.  
  92. ;- VISA GPIB BUS control macros (for _viGpibControlREN, see below) -------------
  93. Global Const $VI_GPIB_REN_DEASSERT = 0
  94. Global Const $VI_GPIB_REN_ASSERT = 1
  95. Global Const $VI_GPIB_REN_DEASSERT_GTL = 2
  96. Global Const $VI_GPIB_REN_ASSERT_ADDRESS = 3
  97. Global Const $VI_GPIB_REN_ASSERT_LLO = 4
  98. Global Const $VI_GPIB_REN_ASSERT_ADDRESS_LLO = 5
  99. Global Const $VI_GPIB_REN_ADDRESS_GTL = 6
  100.  
  101.  
  102. ;- VISA interface ATTRIBUTE NAMES ----------------------------------------------
  103. ; General Attributes
  104. Global Const $VI_ATTR_TMO_VALUE = 0x3FFF001A
  105.  
  106. ; Serial Interface related Attributes
  107. Global Const $VI_ATTR_ASRL_BAUD = 0x3FFF0021
  108. Global Const $VI_ATTR_ASRL_DATA_BITS = 0x3FFF0022
  109. Global Const $VI_ATTR_ASRL_PARITY = 0x3FFF0023
  110. Global Const $VI_ATTR_ASRL_STOP_BITS = 0x3FFF0024
  111. Global Const $VI_ATTR_ASRL_FLOW_CNTRL = 0x3FFF0025
  112.  
  113. ; GPIB message termination attributes
  114. Global $VI_ATTR_TERMCHAR = 0x3FFF0018
  115. Global $VI_ATTR_TERMCHAR_EN = 0x3FFF0038
  116. Global $VI_ATTR_SEND_END_EN = 0x3FFF0016
  117.  
  118. ; NOTE: There are more attribute types. Please refer to the VISA Programmer's Guide
  119.  
  120.  
  121. ;- VISA interface ATTRIBUTE VALUES ---------------------------------------------
  122. ;* TIMEOUT VALUES:
  123. Global Const $VI_TMO_IMMEDIATE = 0
  124. Global Const $VI_TMO_INFINITE = 0xFFFFFFF
  125.  
  126. ; Serial Interface related Attribute Values
  127. Global Const $VI_ASRL_PAR_NONE = 0
  128. Global Const $VI_ASRL_PAR_ODD = 1
  129. Global Const $VI_ASRL_PAR_EVEN = 2
  130. Global Const $VI_ASRL_PAR_MARK = 3
  131. Global Const $VI_ASRL_PAR_SPACE = 4
  132.  
  133. Global Const $VI_ASRL_STOP_ONE = 10
  134. Global Const $VI_ASRL_STOP_ONE5 = 15
  135. Global Const $VI_ASRL_STOP_TWO = 20
  136.  
  137. Global Const $VI_ASRL_FLOW_NONE = 0
  138. Global Const $VI_ASRL_FLOW_XON_XOFF = 1
  139. Global Const $VI_ASRL_FLOW_RTS_CTS = 2
  140. Global Const $VI_ASRL_FLOW_DTR_DSR = 4
  141.  
  142. ; NOTE: There are more attribute values. Please refer to the VISA Programmer's Guide
  143.  
  144.  
  145. ;- VISA Global variable(s) -----------------------------------------------------
  146. ; The VISA Resource Manager is used by the _viOpen functions (see below)
  147. ; This is the only (non constant) Global required by this library
  148. Global $VISA_DEFAULT_RM = -1
  149.  
  150.  
  151.  
  152. ; ==============================================================================
  153. ;- Main VISA/GPIB functions ----------------------------------------------------
  154. ; These include _viExecCommand, _viOpen, _viClose and _viFindGpib
  155.  
  156. ;===============================================================================
  157. ;
  158. ; Description:      MAIN FUNCTION - Send a Command/Query to an Instrument/Device
  159. ; Syntax:           _viExecCommand($h_session, $s_command, $i_timeout_ms = -1)
  160. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session handle (INTEGER)
  161. ;                              * STRING -> A VISA DESCRIPTOR is a string which
  162. ;                                specifies the resource with which to establish a
  163. ;                                communication session. An example descriptor is
  164. ;                                "GPIB::20::0". This function supports all valid
  165. ;                                VISA descriptors, including GPIB, TCP, VXI and
  166. ;                                Serial Interface instruments. A detailed explanation
  167. ;                                of VISA descriptors is shown in the Notes section
  168. ;                                of this function.
  169. ;                                As a SHORTCUT you can use a STRING containing
  170. ;                                the address number (e.g. "20") of a GPIB 
  171. ;                                instrument instead of typing the full descriptor
  172. ;                                (in that case, "GPIB::20::0")
  173. ;                              * INTEGER -> A VISA session handle is an integer
  174. ;                                value returned by _viOpen (see below).
  175. ;                                It is recommended that instead you use _viOpen
  176. ;                                and VISA session handles instead of descriptors
  177. ;                                if you plan to communicate repeteadly with an
  178. ;                                Instrument or Device, as otherwise each time that
  179. ;                                you contact the instrument you would incur the
  180. ;                                overhead of opening and closing the communication
  181. ;                                link.
  182. ;                                Once you are done using the instrument you must
  183. ;                                remember to close the link with _viClose (see below)
  184. ;                   $s_command - Command/Query to execute.
  185. ;                                A query MUST contain a QUESTION MARK (?)
  186. ;                                When the command is a QUERY the function will
  187. ;                                automatically wait for the instrument's answer
  188. ;                                (or until the operation times out)
  189. ;                   $i_timeout_ms - The operation timeout in MILISECONDS
  190. ;                                This is mostly important for QUERIES only
  191. ;                                This is an OPTIONAL PARAMETER.
  192. ;                                If it is not specified the last set timeout will
  193. ;                                be used. If it was never set before the default
  194. ;                                timeout (which depends on the VISA implementation)
  195. ;                                will be used. Timeouts can also be set separatelly
  196. ;                                with the _viSetTimeout function (see below)
  197. ;                   $s_mode - Control the mode in which the VISA viPrintf is called
  198. ;                                This is an OPTIONAL PARAMETER.
  199. ;                                Check the _viPrintf help for more info on 
  200. ;                                this OPTIONAL PARAMETER (whose default value is @LF)
  201. ;                                This is normally NOT necessary and should only be set
  202. ;                                if your GPIB card or instrument require it.
  203. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  204. ;                   visa32.dll is in {WINDOWS}\system32)
  205. ;                   For GPIB communication a GPIB card (such as a National Instruments
  206. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  207. ; Return Value(s):  The return value depends on whether the command is a QUERY
  208. ;                   or not and in whether the operation was successful or not.
  209. ;
  210. ;                   * Command, NON QUERY:
  211. ;                     On Success - Returns ZERO
  212. ;                     On Failure - Returns -1 if the VISA DLL could not be open
  213. ;                                  or a NON ZERO value representing the VISA
  214. ;                                  error code (see the VISA programmer's guide)
  215. ;                   * QUERY:
  216. ;                     On Success - Returns the answer of the instrument to the QUERY
  217. ;                     On Failure - Returns -1 if the VISA DLL could not be open
  218. ;                                  Returns -3 if the VISA DLL returned an unexpected
  219. ;                                  number of results
  220. ;                                  or returns a NON ZERO value representing the VISA
  221. ;                                  error code (see the VISA programmer's guide)
  222. ;
  223. ;                   This function always sets @error to 1 in case of error
  224. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  225. ; Example(s):
  226. ;                 - Simple communication examples:
  227. ;                   Get instrument ID:
  228. ;                     $s_idn = _viExecCommand("GPIB::20::0","*IDN?")
  229. ;                   This is the same as:
  230. ;                     $s_idn = _viExecCommand("20","*IDN?") -> Note that "20" is a STRING
  231. ;
  232. ;                 - More efficient way to communicate many times
  233. ;                   You must use _viOpen and _viClose
  234. ;                   In this example we measure a POWER 100 times:
  235. ;                     $h_session = _viOpen("GPIB::1::0") ; or $h_session = _viOpen("1")
  236. ;                     For $n = 0 To 99
  237. ;                       $power_array[$n] = _viExecCommand($h_session,"POWER?")
  238. ;                     Next
  239. ;                     _viClose($h_session)
  240. ;
  241. ;                   A more complex example, using 2 instruments, a signal generator
  242. ;                   and a spectrum analyzer, to measure the average power error of
  243. ;                   the generator:
  244. ;
  245. ;                     $h_spec_analyzer = _viOpen("GPIB::1::0") ; or $h_session = _viOpen("1")
  246. ;                     $h_signal_gen = _viOpen("GPIB::12::0") ; or $h_session = _viOpen("1")
  247. ;                     $average_power_error = 0
  248. ;                     For $ideal_power = -100 To -10 ; dBM
  249. ;                       _viExecCommand($h_signal_gen,"SOURCE:POWER " & $ideal_power & "dBm")
  250. ;                       $current_power_error = Abs($ideal_power - _viExecCommand($h_spec_analyzer,"POWER?"))
  251. ;                       $average_power_error = $average_power_error + $current_power_error
  252. ;                     Next
  253. ;                     $average_power_error = $average_power_error / 91
  254. ;                     _viClose($h_spec_analyzer)
  255. ;                     _viClose($h_signal_gen)
  256. ;
  257. ; Note(s):
  258. ;                 The following is a description of the MOST COMMON VISA DESCRIPTORS
  259. ;                 Note that there are some more types. For more info please
  260. ;                 refer to a VISA programmer's guide (available at www.ni.com)
  261. ;                 Optional segments are shown in square brackets ([]).
  262. ;                 Required segments that must be filled in are denoted by angle
  263. ;                 brackets (<>).
  264. ;
  265. ;                 Interface   Syntax
  266. ;                 ------------------------------------------------------------
  267. ;                 GPIB INSTR      GPIB[board]::primary address
  268. ;                                 [::secondary address] [::INSTR]
  269. ;                 GPIB INTFC      GPIB[board]::INTFC
  270. ;                 TCPIP SOCKET    TCPIP[board]::host address::port::SOCKET
  271. ;                 Serial INSTR    ASRL[board][::INSTR]
  272. ;                 PXI INSTR       PXI[board]::device[::function][::INSTR]
  273. ;                 VXI INSTR       VXI[board]::VXI logical address[::INSTR]
  274. ;                 GPIB-VXI INSTR  GPIB-VXI[board]::VXI logical address[::INSTR]
  275. ;                 TCPIP INSTR     TCPIP[board]::host address[::LAN device name]
  276. ;                                 [::INSTR]
  277. ;
  278. ;                 The GPIB keyword is used for GPIB instruments.
  279. ;                 The TCPIP keyword is used for TCP/IP communication.
  280. ;                 The ASRL keyword is used for serial instruments.
  281. ;                 The PXI keyword is used for PXI instruments.
  282. ;                 The VXI keyword is used for VXI instruments via either embedded
  283. ;                 or MXIbus controllers.
  284. ;                 The GPIB-VXI keyword is used for VXI instruments via a GPIB-VXI
  285. ;                 controller.
  286. ;
  287. ;                 The default values for optional parameters are shown below.
  288. ;
  289. ;                 Optional Segment          Default Value
  290. ;                 ---------------------------------------
  291. ;                 board                     0
  292. ;                 secondary address         none
  293. ;                 LAN device name           inst0
  294. ;
  295. ;
  296. ;                 Example Resource Strings:
  297. ;                 --------------------------------------------------------------
  298. ;                 GPIB::1::0::INSTR     A GPIB device at primary address 1 and
  299. ;                                       secondary address 0 in GPIB interface 0.
  300. ;
  301. ;                 GPIB2::INTFC          Interface or raw resource for GPIB
  302. ;                                       interface 2.
  303. ;
  304. ;                 TCPIP0::1.2.3.4::999::SOCKET    Raw TCP/IP access to port 999
  305. ;                                                 at the specified IP address.
  306. ;
  307. ;                 ASRL1::INSTR          A serial device attached to interface
  308. ;                                       ASRL1.  VXI::MEMACC Board-level register
  309. ;                                       access to the VXI interface.
  310. ;
  311. ;                 PXI::15::INSTR        PXI device number 15 on bus 0.
  312. ;
  313. ;                 VXI0::1::INSTR        A VXI device at logical address 1 in VXI
  314. ;                                       interface VXI0.
  315. ;
  316. ;                 GPIB-VXI::9::INSTR    A VXI device at logical address 9 in a
  317. ;                                       GPIB-VXI controlled system.
  318. ;
  319. ;===============================================================================
  320.  
  321. Func _viExecCommand($h_session, $s_command, $i_timeout_ms = -1, $s_mode = @LF)
  322.   If StringInStr($s_command,"?") == 0 Then
  323.     ; The Command is NOT a QUERY
  324.     Return _viPrintf($h_session, $s_command, $i_timeout_ms, $s_mode)
  325.   Else
  326.     ; The Command is a QUERY
  327.     Return _viQueryf($h_session, $s_command, $i_timeout_ms)
  328.   EndIf
  329. EndFunc
  330.  
  331.  
  332. ;===============================================================================
  333. ;
  334. ; Description:      Opens a VISA connection to an Instrument/Device
  335. ; Syntax:           _viOpen($s_visa_address, $s_visa_secondary_address = 0)
  336. ; Parameter(s):     $s_visa_address - A VISA resource descriptor STRING (see the 
  337. ;                   NOTES of _viExecCommand above for more info)
  338. ;                   As as shortcut you can also directly pass a GPIB address as 
  339. ;                   an integer
  340. ;                   $s_visa_secondary_address - Some GPIB instruments have
  341. ;                   secondary addresses. This parameter is ZERO by default, which
  342. ;                   means NO SECONDARY ADDRESS.
  343. ;                   Only use this optional parameter if the primary address is
  344. ;                   passed as an integer
  345. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  346. ;                   visa32.dll is in {WINDOWS}\system32)
  347. ;                   For GPIB communication a GPIB card (such as a National Instruments
  348. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  349. ; Return Value(s):  On Success - Returns a (POSITIVE) VISA Instrument Handle
  350. ;                   On Failure - Returns -1 and SETS @error to 1
  351. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  352. ; Note(s):          For simple usage there is no need to use this function, as
  353. ;                   _viExecCommand automatically opens/closes a VISA connection
  354. ;                   if you pass it a VISA resource descriptor (see the NOTES of
  355. ;                   _viExecCommand above for more info)
  356. ;
  357. ;                   However, if you want to repeteadly send commands/queries to
  358. ;                   a device, you should call this function followed by using the
  359. ;                   returned instrument handle instead of the VISA descriptor
  360. ;
  361. ;                   Do not forget to use _viClose when you are done, though
  362. ;
  363. ;===============================================================================
  364.  
  365. Func _viOpen($s_visa_address, $s_visa_secondary_address = 0)
  366.   Local $h_session = -1 ; The session handle by default is invalid (-1)
  367.   
  368.   If IsNumber($s_visa_address) Or StringInStr($s_visa_address,"::") == 0 Then
  369.     ; We passed a number => Create the VISA string:
  370.     $s_visa_address = "GPIB0::" & $s_visa_address & "::" & $s_visa_secondary_address
  371.   EndIf
  372.  
  373.   ;- Do not open an instrument connection twice
  374.   ; TODO
  375.  
  376.   ;- Make sure that there is a Resource Manager open (Note: this will NOT open it twice!)
  377.   _viOpenDefaultRM()
  378.  
  379.   ;- Open the INSTRUMENT CONNECTION
  380.   ; errStatus = viOpen (VISA_DEFAULT_RM, "GPIB0::20::0", VI_NULL, VI_NULL, &h_session);
  381.   ; signed int viOpen(unsigned long, char*, unsigned long, unsigned long, *unsigned long)
  382.   Local $a_results
  383.   $a_results = DllCall("visa32.dll", "long","viOpen", "long", $VISA_DEFAULT_RM, "str",$s_visa_address, "long",$VI_NULL, "long",$VI_NULL,"long_ptr",-1)
  384.   If @error <> 0 Then
  385.     ; Could not open VISA (visa32.dll)
  386.     ;MsgBox(16,"_viOpen - DllCall error","Could not open VISA (visa32.dll)")
  387.     Return -1
  388.   EndIf
  389.   Local $errStatus = $a_results[0]
  390.   If $errStatus <> 0 Then
  391.     ; Could not open VISA instrument/resource
  392.     SetError(1)
  393.     ;MsgBox(16,"VISA error","Could not open VISA instrument/resource: " & $s_visa_address)
  394.     Return -2
  395.   EndIf
  396.   ; Make sure that the DllCall returned enough values
  397.   If UBound($a_results) < 6 Then
  398.     SetError(1)
  399.     ;MsgBox(16,"VISA error","Call to viOpen did not return the right number of values")
  400.     Return -3
  401.   EndIf
  402.  
  403.   $h_session = $a_results[5]
  404.   If $h_session <= 0 Then
  405.     ; viOpen did not return a valid handle
  406.     SetError(1)
  407.     ;MsgBox(16,"VISA error","viOpen did not return a valid handle")
  408.     Return -4
  409.   EndIf
  410.   
  411.   ; We have a valid handle for the device  
  412.   Return $h_session
  413. EndFunc
  414.  
  415.  
  416. ;===============================================================================
  417. ;
  418. ; Description:      Closes a VISA connection to an Instrument/Device
  419. ; Syntax:           _viClose($h_session)
  420. ; Parameter(s):     $h_session - A VISA session handle (as returned by _viOpen)
  421. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  422. ;                   visa32.dll is in {WINDOWS}\system32)
  423. ;                   For GPIB communication a GPIB card (such as a National Instruments
  424. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  425. ; Return Value(s):  On Success - Returns 0
  426. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  427. ;                                or a NON ZERO value representing the VISA
  428. ;                                error code (see the VISA programmer's guide)
  429.  
  430. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  431. ; Note(s):          For simple usage there is no need to use this function, as
  432. ;                   _viExecCommand automatically opens/closes a VISA connection
  433. ;                   if you pass it a VISA resource descriptor (see the NOTES of
  434. ;                   _viExecCommand above for more info)
  435. ;
  436. ;                   However, if you want to repeteadly send commands/queries to
  437. ;                   a device, you should use _viOpen followed by using the
  438. ;                   returned instrument handle instead of the VISA descriptor
  439. ;                   and then calling this function
  440. ;
  441. ;===============================================================================
  442.  
  443. Func _viClose($h_session)
  444.   ;- Close INSTRUMENT Connection
  445.   ; viClose(h_session);
  446.   Local $a_results
  447.   $a_results = DllCall("visa32.dll", "int","viClose", "int",$h_session)
  448.   If @error <> 0 Then
  449.     ;MsgBox(16,"_viClose - DllCall error","Could not open VISA (visa32.dll)")
  450.     Return -1
  451.   EndIf
  452.   Local $errStatus = $a_results[0]
  453.   If $errStatus <> 0 Then
  454.     ; Could not close VISA instrument/resource
  455.     SetError(1)
  456.     ;MsgBox(16,"VISA error","Could not close VISA instrument/resource: " & $h_session)
  457.     Return $errStatus
  458.   EndIf
  459.   
  460.   Return 0
  461. EndFunc
  462.  
  463.  
  464. ;===============================================================================
  465. ;
  466. ; Description:      Find all the DEVICES found in the GPIB bus
  467. ; Syntax:           _viFindGpib(ByRef $a_descriptor_list, ByRef $a_idn_list, $f_show_search_results = 0)
  468. ; Parameter(s):     $a_descriptor_list (ByRef) - RETURNS an array of the VISA resource 
  469. ;                   descriptors (see the NOTES of _viExecCommand above for more 
  470. ;                   info) of the instruments that were found in the GPIB bus
  471. ;                   $a_idn_list (ByRef) - RETURNS an array of the IDNs (i.e names)
  472. ;                   of the instruments that were found in the GPIB bus
  473. ;                   $f_show_search_results - If 1 a message box showing the
  474. ;                   results of the search will be shown
  475. ;                   The default is 0, which means that the results are not shown
  476. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  477. ;                   visa32.dll is in {WINDOWS}\system32)
  478. ;                   For GPIB communication a GPIB card (such as a National Instruments
  479. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  480. ; Return Value(s):  On Success - The number of instruments found (0 or more)
  481. ;                   On Failure - Returns a NEGATIVE value and SETS @error to 1
  482. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  483. ; Example(s):
  484. ;  ; This example performs a search on the GPIB bus and shows the results in a MsgBox
  485. ;  Dim $a_descriptor_list[1], $a_idn_list[1]
  486. ;  _viFindGpib($a_descriptor_list, $a_idn_list, 1)
  487. ;
  488. ; Note(s):          For simple usage there is no need to use this function, as
  489. ;                   _viExecCommand automatically opens/closes a VISA connection
  490. ;                   if you pass it a VISA resource descriptor (see the NOTES of
  491. ;                   _viExecCommand above for more info)
  492. ;
  493. ;                   However, if you want to repeteadly send commands/queries to
  494. ;                   a device, you should call this function followed by using the
  495. ;                   returned instrument handle instead of the VISA descriptor
  496. ;
  497. ;                   Do not forget to use _viClose when you are done, though
  498. ;
  499. ;===============================================================================
  500.  
  501. Func _viFindGpib(ByRef $a_descriptor_list, ByRef $a_idn_list, $f_show_search_results = 0)
  502.   ;- Make sure that there is a Resource Manager open (Note: this will NOT open it twice!)
  503.   _viOpenDefaultRM()
  504.  
  505.   ; Create the GPIB instrument list and return the 1st instrument descriptor
  506.   ; viStatus viFindRsrc (viSession, char*, *ViFindList, *ViUInt32, char*);
  507.   ; errStatus = viFindRsrc (VISA_DEFAULT_RM, "GPIB?*INSTR", &h_current_instr, &num_matches, s_found_instr_descriptor);
  508.   Local $a_results = DllCall("visa32.dll", "long","viFindRsrc", _
  509.     "long", $VISA_DEFAULT_RM, "str","GPIB?*INSTR", "long_ptr",-1, _
  510.     "int_ptr",-1, "str","")
  511.   If @error <> 0 Then
  512.     ; Could not open VISA (visa32.dll)
  513.     ;MsgBox(16,"_viFindGpib - DllCall error","Could not open VISA (visa32.dll)")
  514.     Return -1
  515.   EndIf
  516.   Local $errStatus = $a_results[0]
  517.   If $errStatus <> 0 Then
  518.     ; Could not perform GPIB FIND operation
  519.     SetError(1)
  520.     ;MsgBox(16,"VISA error","Could not perform GPIB FIND operation")
  521.     Return -2
  522.   EndIf
  523.   ; Make sure that the DllCall returned enough values
  524.   If UBound($a_results) < 5 Then
  525.     SetError(1)
  526.     ;MsgBox(16,"VISA error","Call to viFindRsrc did not return the right number of values")
  527.     Return -3
  528.   EndIf
  529.  
  530.   ; Assign the outputs of the DllCall
  531.   Local $h_list_pointer = $a_results[3] ; The pointer to the list of found instruments
  532.   Local $i_num_instr = $a_results[4] ; The number of instruments that were found
  533.   Local $s_first_descriptor = $a_results[5] ; The descriptor of the first instrument found
  534.   If $i_num_instr < 1 Then ; No insturments were found
  535.     If $f_show_search_results == 1 Then
  536.       MsgBox(64,"GPIB search results","NO INSTRUMENTS FOUND in the GPIB bus")
  537.     EndIf
  538.  
  539.     Return $i_num_instr
  540.   EndIf
  541.  
  542.   ; At least 1 instrument was found
  543.   ReDim $a_descriptor_list[$i_num_instr], $a_idn_list[$i_num_instr]
  544.   $a_descriptor_list[0] = $s_first_descriptor
  545.   ; Get the IDN of the 1st instrument
  546.   $a_idn_list[0] = _viExecCommand($s_first_descriptor,"*IDN?")
  547.  
  548.   ; Get the IDN of all the remaining instruments
  549.   For $n=1 To $i_num_instr-1
  550.     ; If more than 1 instrument was found, get the handle of the next instrument
  551.     ; and get its IDN
  552.  
  553.     ;- Get the handle and descriptor of the next instrument in the GPIB bus
  554.     ; We do this by calling "viFindNext"
  555.     ; viFindNext (*ViFindList, char*);
  556.     ; viFindNext (h_current_instr,s_found_instr_descriptor);
  557.     $a_results = DllCall("visa32.dll", "long","viFindNext", "long",$h_list_pointer, "str","")
  558.     If @error <> 0 Then
  559.       ; Could not open VISA (visa32.dll)
  560.       ;MsgBox(16,"_viFindGpib - DllCall error","Could not open VISA (visa32.dll)")
  561.       Return -1
  562.     EndIf
  563.     $errStatus = $a_results[0]
  564.     If $errStatus <> 0 Then
  565.       ; Could not perform GPIB FIND NEXT operation
  566.       SetError(1)
  567.       ;MsgBox(16,"VISA error","Could not perform GPIB FIND NEXT operation")
  568.       Return -2
  569.     EndIf
  570.     ; Make sure that the DllCall returned enough values
  571.     If UBound($a_results) < 3 Then
  572.       SetError(1)
  573.       ;MsgBox(16,"VISA error","Call to viFindNext did not return the right number of values")
  574.       Return -3
  575.     EndIf
  576.     $a_descriptor_list[$n] = $a_results[2]
  577.     $a_idn_list[$n] = _viExecCommand($a_descriptor_list[$n],"*IDN?")
  578.   Next
  579.  
  580.   If $f_show_search_results == 1 Then
  581.     ; Create the GPIB instrument list and show it in a MsgBox
  582.     Local $s_search_results = ""
  583.     For $n=0 To $i_num_instr-1
  584.       $s_search_results = $s_search_results & $a_descriptor_list[$n] & " - " & $a_idn_list[$n] & @CR
  585.     Next
  586.     MsgBox(64,"GPIB search results",$s_search_results)
  587.   EndIf
  588.  
  589.   Return $i_num_instr
  590.  
  591. EndFunc
  592.  
  593.  
  594. ;===============================================================================
  595. ;- Internal VISA functions, used by _viExecCommand, _viOpen and/or _viClose ----
  596. ; The functions in this section are not meant to be called outside this library
  597. ; under normal use
  598.  
  599. ;===============================================================================
  600. ;
  601. ; Description:      Open the VISA Resource Manager
  602. ; Syntax:           _viOpenDefaultRM()
  603. ; Parameter(s):     None
  604. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  605. ;                   visa32.dll is in {WINDOWS}\system32)
  606. ;                   For GPIB communication a GPIB card (such as a National Instruments
  607. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  608. ; Return Value(s):  On Success - The Default Resource Manager Handle (also stored
  609. ;                   in the $VISA_DEFAULT_RM global)
  610. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  611. ;                                Returns -2 if there was an error opening the 
  612. ;                                Default Resource Manager
  613. ;                                Returns -3 if the returned Resource Manager is
  614. ;                                invalid
  615. ;                   This function always sets @error to 1 in case of error
  616. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  617. ; Note(s):          You should not need to directly call this function under
  618. ;                   normal use as _viOpen calls it when necessary
  619. ;
  620. ;===============================================================================
  621. Func _viOpenDefaultRM()
  622.   Local $h_visa_rm = $VISA_DEFAULT_RM
  623.   If $VISA_DEFAULT_RM < 0 Then
  624.     ; Only open the Resource Manager once (i.e. when $VISA_DEFAULT_RM is still -1)
  625.     $h_visa_rm = $VISA_DEFAULT_RM ; Initialize the output result with the default value (-1)
  626.  
  627.     ; errStatus = viOpenDefaultRM (&VISA_DEFAULT_RM);
  628.     ; signed int viOpenDefaultRM(*unsigned long)
  629.     Local $a_results
  630.     $a_results = DllCall("visa32.dll", "int","viOpenDefaultRM", "int_ptr",$VISA_DEFAULT_RM)
  631.     If @error <> 0 Then
  632.       ; Could not open VISA (visa32.dll)
  633.       ;MsgBox(16,"_viOpenDefaultRM - DllCall error","Could not open VISA (visa32.dll)")
  634.       Return -1
  635.     EndIf
  636.     Local $errStatus = $a_results[0]
  637.     If $errStatus <> 0 Then
  638.       ; Could not create VISA Resource Manager
  639.       SetError(1)
  640.       ;MsgBox(16,"VISA error","Could not create VISA Resource Manager")
  641.       Return -2
  642.     EndIf
  643.     ; Everything went fine => Set the Resource Manager global
  644.     $VISA_DEFAULT_RM = $a_results[1]
  645.     If $VISA_DEFAULT_RM <= 0 Then
  646.       ; There was an error, reset the $VISA_DEFAULT_RM
  647.       $VISA_DEFAULT_RM = -1 ; Default value
  648.       SetError(1)
  649.       Return -3
  650.     EndIf
  651.     $h_visa_rm = $VISA_DEFAULT_RM
  652.   EndIf
  653.   
  654.   Return $h_visa_rm
  655. EndFunc
  656.  
  657.  
  658. ;===============================================================================
  659. ;
  660. ; Description:      Send a COMMAND (NOT a QUERY) to an Instrument/Device
  661. ; Syntax:           _viPrintf($h_session, $s_command, $i_timeout_ms = -1)
  662. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session handle (INTEGER)
  663. ;                                Look at the _viExecCommand function for more
  664. ;                                details
  665. ;                   $s_command - Command/Query to execute.
  666. ;                                A query MUST contain a QUESTION MARK (?)
  667. ;                                When the command is a QUERY the function will
  668. ;                                automatically wait for the instrument's answer
  669. ;                                (or until the operation times out)
  670. ;                   $i_timeout_ms - The operation timeout in MILISECONDS
  671. ;                                This is mostly important for QUERIES only
  672. ;                                This is an OPTIONAL PARAMETER.
  673. ;                                If it is not specified the last set timeout will
  674. ;                                be used. If it was never set before the default
  675. ;                                timeout (which depends on the VISA implementation)
  676. ;                                will be used. Timeouts can also be set separatelly
  677. ;                                with the _viSetTimeout function (see below).
  678. ;                                Depending on the bus type (GPIB, TCP, etc) the
  679. ;                                timeout might not be set to the exact value that
  680. ;                                you request. Instead the closest valid timeout
  681. ;                                bigger than the one that you requested will be used.
  682. ;                   $s_mode - Control the mode in which the VISA viPrintf is called
  683. ;                                This is an OPTIONAL PARAMETER
  684. ;                                The DEFAULT VALUE is @LF, which means "attach @LF mode".
  685. ;                                Some instruments and in particular many GPIB cards
  686. ;                                Do not honor the terminator character attribute
  687. ;                                In those cases an @LF terminator needs to be added.
  688. ;                                As this is the most common case, by default the mode
  689. ;                                is set to @LF, which appends @LF to the SCPI command
  690. ;                                You can also set this mode to @CR and @CRLF if your card
  691. ;                                uses those terminators.
  692. ;                                If you do not want to use a terminator, set this parameter
  693. ;                                to an empty string ("")
  694. ;                                Also, some cards support the execution of a "sprintf" on the 
  695. ;                                SCPI string prior to sending it through the VISA interface.
  696. ;                                For those who do, it is possible, by setting this 
  697. ;                                parameter to "str" to "protect" the VISa interface from
  698. ;                                accidentally applying an escape sequence when a "/" is
  699. ;                                found within the VISA command string.
  700. ;                                This is normally NOT necessary and should only be set
  701. ;                                if your GPIB card or instrument require it.
  702. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  703. ;                   visa32.dll is in {WINDOWS}\system32)
  704. ;                   For GPIB communication a GPIB card (such as a National Instruments
  705. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  706. ; Return Value(s):  On Success - Returns ZERO
  707. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  708. ;                                or a NON ZERO value representing the VISA
  709. ;                                error code (see the VISA programmer's guide)
  710. ;                   This function always sets @error to 1 in case of error
  711. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  712. ; Note(s):
  713. ;                   Normally you do not need to use this function, 
  714. ;                   as _viExecCommand automatically choses between _viPrintf and
  715. ;                   _viQueryf depending on the command type.
  716. ;
  717. ;                   If you need to use it anyway, it is recommended that you do 
  718. ;                   not use this command for sending QUERIES, only for GPIB 
  719. ;                   commands that DO NOT RETURN AN ANSWER
  720. ;
  721. ;                   Also, this is not really a "PRINTF-like" function, as it 
  722. ;                   does not allow you to pass multiple parameters. This is only
  723. ;                   called _viPrintf because it uses the VISA function viPrintf
  724. ;
  725. ;                   See _viExecCommand for more details
  726. ;
  727. ;===============================================================================
  728.  
  729. Func _viPrintf($h_session, $s_command, $i_timeout_ms = -1, $s_option = @LF)
  730.   Local $f_close_session_before_return = 0 ; By default do not close the session at the end
  731.   If IsString($h_session) Then
  732.     ; When we pass a string, i.e. a VISA ID (like GPIB::20::0, for instance) instead
  733.     ; of a VISA session handler, we will automatically OPEN and CLOSE the instrument
  734.     ; session for the user.
  735.     ; This is of course slower if you need to do more than one GPIB call but much
  736.     ; more convenient for short tests
  737.     $f_close_session_before_return = 1
  738.     $h_session = _viOpen($h_session)
  739.   EndIf
  740.  
  741.   ;- Set the VISA timeout if necessary
  742.   If $i_timeout_ms >= 0 Then
  743.     _viSetTimeout($h_session, $i_timeout_ms)
  744.   EndIf
  745.  
  746.   ;- Send Command to instrument (using viPrintf VISA function)
  747.   ; The syntax of the viPrintf VISA function is:
  748.   ; errStatus = viPrintf (h_session, "%s", "*RST");
  749.   ; signed int viPrintf (unsigned long, char*, char*);
  750.  
  751.   ; For symmetry with the viQueryf function, and to solve compatibility issues
  752.   ; with some instruments, call viPrintf WITHOUT protecting from escape sequences
  753.   ; The user MUST thus be careful when passing commands containing the '/' character
  754.   Local $a_results
  755.   Select
  756.     Case $s_option == "str"
  757.         ; Use the "str" mode to pass the SCPI command to the VISA interface
  758.         $a_results = DllCall("visa32.dll", "int","viPrintf", "int",$h_session, "str","%s", "str",$s_command) ; Call viPrintf with escape sequence protection
  759.     Case ($s_option == @CR Or $s_option == @LF Or $s_option == @CRLF)
  760.         ; Append the selected terminator to the SCPI command
  761.         $a_results = DllCall("visa32.dll", "int","viPrintf", "int",$h_session, "str", $s_command & $s_option)
  762.     Case Else ; In all other cases, ignore the "mode" and do not use any terminator string
  763.         $a_results = DllCall("visa32.dll", "int","viPrintf", "int",$h_session, "str", $s_command) ; Call viPrintf without escape sequence protection
  764.   EndSelect
  765.   
  766.   If @error <> 0 Then
  767.     ; Could not open VISA (visa32.dll)
  768.     ;MsgBox(16,"_viPrintf - DllCall error","Could not open VISA (visa32.dll)")
  769.     Return -1
  770.   EndIf
  771.   Local $errStatus = $a_results[0]
  772.   If $errStatus <> 0 Then
  773.     ; Could not send command to VISA instrument/resource
  774.     SetError(1)
  775.     ;MsgBox(16,"VISA error","Could not send command to VISA instrument/resource: " & $h_session)
  776.     Return $errStatus
  777.   EndIf
  778.  
  779.   If $f_close_session_before_return == 1 Then
  780.     _viClose($h_session)
  781.   EndIf
  782. EndFunc
  783.  
  784.  
  785. ;===============================================================================
  786. ;
  787. ; Description:      Send a QUERY (a Command that returns an answer) to an Instrument/Device
  788. ; Syntax:           _viQueryf($h_session, $s_query, $i_timeout_ms = -1)
  789. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session handle (INTEGER)
  790. ;                                Look at the _viExecCommand function for more
  791. ;                                details
  792. ;                   $s_command - The query to execute (e.g. "*IDN?").
  793. ;                                A query MUST contain a QUESTION MARK (?)
  794. ;                                The function willautomatically wait for the 
  795. ;                                instrument's answer (or until the operation 
  796. ;                                times out)
  797. ;                   $i_timeout_ms - The operation timeout in MILISECONDS
  798. ;                                This is mostly important for QUERIES only
  799. ;                                This is an OPTIONAL PARAMETER.
  800. ;                                If it is not specified the last set timeout will
  801. ;                                be used. If it was never set before the default
  802. ;                                timeout (which depends on the VISA implementation)
  803. ;                                will be used. Timeouts can also be set separatelly
  804. ;                                with the _viSetTimeout function (see below)
  805. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  806. ;                   visa32.dll is in {WINDOWS}\system32)
  807. ;                   For GPIB communication a GPIB card (such as a National Instruments
  808. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  809. ; Return Value(s):  On Success - Returns a STRING containing the answer of the 
  810. ;                                instrument to the QUERY
  811. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  812. ;                                Returns -3 if the VISA DLL returned an unexpected
  813. ;                                number of results
  814. ;                                or returns a NON ZERO value representing the VISA
  815. ;                                error code (see the VISA programmer's guide)
  816. ;                   This function always sets @error to 1 in case of error
  817. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  818. ; Note(s):
  819. ;                   Normally you do not need to use this function, 
  820. ;                   as _viExecCommand automatically choses between _viPrintf and
  821. ;                   _viQueryf depending on the command type.
  822. ;
  823. ;                   If you need to use it anyway, make sure that you use it for 
  824. ;                   a command that RETURNS an ANSWER or you will be stuck until 
  825. ;                   the Timeout expires, which could never happen if the Timeout
  826. ;                   is infinite ("INF")!
  827. ;
  828. ;                   Also, this is not really a "SCANF-like" function, as it 
  829. ;                   does not allow you to specify the format of the output
  830. ;
  831. ;                   There are two known limitations of this function:
  832. ;                   - The GPIB queries only return the 1st line of the device 
  833. ;                     answer. This is normally not a problem as most devices
  834. ;                     always return a single line answer.
  835. ;                   - The GPIB queries do not support binary transfer.
  836. ;
  837. ;                   See _viExecCommand for more details
  838. ;
  839. ;===============================================================================
  840. Func _viQueryf($h_session, $s_query, $i_timeout_ms = -1)
  841.   Local $f_close_session_before_return = 0 ; By default do not close the session at the end
  842.   If IsString($h_session) Then
  843.     ; When we pass a string, i.e. a VISA ID (like GPIB::20::0, for instance) instead
  844.     ; of a VISA session handler, we will automatically OPEN and CLOSE the instrument
  845.     ; session for the user.
  846.     ; This is of course slower if you need to do more than one GPIB call but much
  847.     ; more convenient for short tests
  848.     $f_close_session_before_return = 1
  849.     $h_session = _viOpen($h_session)
  850.   EndIf
  851.  
  852.   ;- Set the VISA timeout if necessary
  853.   If $i_timeout_ms >= 0 Then
  854.     _viSetTimeout($h_session, $i_timeout_ms)
  855.   EndIf
  856.  
  857.   ;- Send QUERY to instrument and get ANSWER
  858.   ; errStatus = viQueryf (h_session, "*IDN?\n", "%s", s_answer);
  859.   ; signed int viQueryf (unsigned long, char*, char*, char*);
  860.   ;errStatus = viQueryf (h_instr, s_command, "%s", string);
  861.   Local $a_results, $s_answer = ""
  862.   $a_results = DllCall("visa32.dll", "int","viQueryf", "int",$h_session, "str",$s_query, "str","%t", "str", $s_answer)
  863.   If @error <> 0 Then
  864.     ; Could not open VISA (visa32.dll)
  865.     ;MsgBox(16,"_viQueryf - DllCall error","Could not open VISA (visa32.dll)")
  866.     Return -1
  867.   EndIf
  868.   Local $errStatus = $a_results[0]
  869.   If $errStatus <> 0 Then
  870.     ; Could not query VISA instrument/resource
  871.     SetError(1)
  872.     ;MsgBox(16,"VISA error","Could not query VISA instrument/resource: " & $h_session)
  873.     Return $errStatus
  874.   EndIf
  875.   ; Make sure that the DllCall returned enough values
  876.   If UBound($a_results) < 5 Then
  877.     ; Call to viQuery did not return the right number of values
  878.     SetError(1)
  879.     ;MsgBox(16,"VISA error","Call to viQuery did not return the right number of values")
  880.     Return -3
  881.   EndIf
  882.   $s_answer = $a_results[4]
  883.  
  884.   If $f_close_session_before_return == 1 Then
  885.     _viClose($h_session)
  886.   EndIf
  887.  
  888.   Return $s_answer
  889. EndFunc
  890.  
  891.  
  892. ;- Misc VISA interface functions -----------------------------------------------
  893.  
  894. ;===============================================================================
  895. ;
  896. ; Description:      Sets the VISA timeout in MILISECONDS (uses _viSetAttribute)
  897. ; Syntax:           _viSetTimeout($h_session, $i_timeout_ms)
  898. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session
  899. ;                   handle (INTEGER). Look the explanation in _viExecCommand
  900. ;                   (you can find it above)
  901. ;                   $i_timeout_ms - The timeout IN MILISECONDS for VISA operations
  902. ;                   (mainly for GPIB queries)
  903. ;                   If you set it to 0 the tiemouts are DISABLED
  904. ;                   If you set it to "INF" the VISA operations will NEVER timeout.
  905. ;                   Be careful with this as it could easly hung your program if
  906. ;                   your instrument does not respond to one of your queries
  907. ;                   Depending on the bus type (GPIB, TCP, etc) the timeout might 
  908. ;                   not be set to the exact value that you request. Instead the 
  909. ;                   closest valid timeout bigger than the one that you requested 
  910. ;                   will be used.
  911. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  912. ;                   visa32.dll is in {WINDOWS}\system32)
  913. ;                   For GPIB communication a GPIB card (such as a National Instruments
  914. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  915. ; Return Value(s):  On Success - Returns 0
  916. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  917. ;                                or a NON ZERO value representing the VISA
  918. ;                                error code (see the VISA programmer's guide)
  919. ;                   This function always sets @error to 1 in case of error
  920. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  921. ; Note(s):          You can avoid directly calling this function most of the time,
  922. ;                   as _viExecCommand accepts a timeout (in ms) as its 3rd argument.
  923. ;                   If you do not pass this 3rd argument then the previous timeout
  924. ;                   will be used (or the default timeout, which depends on the
  925. ;                   VISA driver, if it was never set before)
  926. ;
  927. ;===============================================================================
  928. Func _viSetTimeout($h_session, $i_timeout_ms)
  929.   If StringUpper(String($i_timeout_ms)) == "INF" Then
  930.     $i_timeout_ms = $VI_TMO_INFINITE
  931.   EndIf
  932.   Return _viSetAttribute($h_session, $VI_ATTR_TMO_VALUE, $i_timeout_ms)
  933. EndFunc
  934.  
  935.  
  936. ;===============================================================================
  937. ;
  938. ; Description:      VISA attribute set (GENERIC)
  939. ;                   Called by _viSetTimeout, this function can ALSO be used to 
  940. ;                   set many other VISA specific attributes, like the Serial
  941. ;                   Interface Attributes.
  942. ;                   Read the VISA documentation for more information
  943. ; Syntax:           _viSetAttribute($h_session, $i_attribute, $i_value)
  944. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session
  945. ;                   handle (INTEGER). Look the explanation in _viExecCommand
  946. ;                   (you can find it above)
  947. ;                   $i_attribute - The index of the attribute that must be changed
  948. ;                   Attributes are defined in the VISA library. This AutoIt
  949. ;                   implementation only defines a CONSTANT for the TIMEOUT
  950. ;                   attribute ($VI_ATTR_TMO_VALUE) but you can pass any other
  951. ;                   index if you want to.
  952. ;                   $i_value - The value of the attribute. It must be an integer
  953. ;                   and the possible values depend on the attribute type
  954. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  955. ;                   visa32.dll is in {WINDOWS}\system32)
  956. ;                   For GPIB communication a GPIB card (such as a National Instruments
  957. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  958. ; Return Value(s):  On Success - Returns 0
  959. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  960. ;                                or a NON ZERO value representing the VISA
  961. ;                                error code (see the VISA programmer's guide)
  962. ;                   This function always sets @error to 1 in case of error
  963. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  964. ; Note(s):          
  965. ;                   This is a list of the currently pre-defined attributes and 
  966. ;                   values. Remember that you can use any other valid 
  967. ;                   attribute/value by passing the corresponding integer index 
  968. ;                   (as defined in the VISA programmer's guide) to this function.
  969. ;                   
  970. ;                   * Attribute: $VI_ATTR_TMO_VALUE -> Set Timeout
  971. ;                   * Values:
  972. ;                             A timeout in MILLISECONDS or
  973. ;                             $VI_TMO_IMMEDIATE (or 0) for "Return immediatly"
  974. ;                             VI_TMO_INFINITE (or "INF") for "No timeout"
  975. ;                           
  976. ;                   * Attribute: $VI_ATTR_TERMCHAR -> Set Termination Character
  977. ;                   * Values:
  978. ;                             The ASCII code number of the terminator character 
  979. ;                             which is used for VISA messages.
  980. ;                             - Typical values are:
  981. ;                                0x0A: Linefeed or newline ("\n")
  982. ;                                0x0C: Form feed ("\f")
  983. ;                                0x0D: Carriage return ("\r")
  984. ;
  985. ;                   * Attribute: $VI_ATTR_TERMCHAR_EN -> Set Termination Character
  986. ;                   * Values:
  987. ;                             For many instruments this attribute has no effect.
  988. ;                             For those who take it into account:
  989. ;                             $VI_FALSE: Wait for the TIMEOUT before returning from
  990. ;                                        a viRead operation 
  991. ;                             $VI_TRUE: Allow read operations to terminate as soon
  992. ;                                       as the "VI_ATTR_TERMCHAR" character is received
  993. ;                                       during a viRead.
  994. ;                             which is used for VISA messages (e.g. 10)
  995. ;                             $VI_TMO_IMMEDIATE (or 0) for "Return immediatly"
  996. ;                             VI_TMO_INFINITE (or "INF") for "No timeout"
  997. ;                   * Default Value: $VI_FALSE. Note that many instruments ignore this.
  998. ;
  999. ;                   * Attribute: $VI_ATTR_ASRL_BAUD
  1000. ;                   * Values:
  1001. ;                             Any valid baudrate (9600, 115200, etc)
  1002. ;                   
  1003. ;                   * Attribute: $VI_ATTR_ASRL_DATA_BITS
  1004. ;                   * Values: 
  1005. ;                             From 5 to 8
  1006. ;                   
  1007. ;                   * Attribute: $VI_ATTR_ASRL_PARITY
  1008. ;                   * Values:
  1009. ;                             $VI_ASRL_PAR_NONE
  1010. ;                             $VI_ASRL_PAR_ODD
  1011. ;                             $VI_ASRL_PAR_EVEN
  1012. ;                             $VI_ASRL_PAR_MARK
  1013. ;                             $VI_ASRL_PAR_SPACE
  1014. ;                   
  1015. ;                   * Attribute: $VI_ATTR_ASRL_STOP_BITS
  1016. ;                   * Values:
  1017. ;                             $VI_ASRL_STOP_ONE 
  1018. ;                             $VI_ASRL_STOP_ONE5
  1019. ;                             $VI_ASRL_STOP_TWO 
  1020. ;                             
  1021. ;                   * Attribute: $VI_ATTR_ASRL_FLOW_CNTRL
  1022. ;                   * Values:
  1023. ;                             $VI_ASRL_FLOW_NONE
  1024. ;                             $VI_ASRL_FLOW_XON_XOFF
  1025. ;                             $VI_ASRL_FLOW_RTS_CTS
  1026. ;                             $VI_ASRL_FLOW_DTR_DSR
  1027.  
  1028.  
  1029. ;
  1030. ;===============================================================================
  1031. Func _viSetAttribute($h_session, $i_attribute, $i_value)
  1032.   Local $f_close_session_before_return = 0 ; By default do not close the session at the end
  1033.   If IsString($h_session) Then
  1034.     ; When we pass a string, i.e. a VISA ID (like GPIB::20::0, for instance) instead
  1035.     ; of a VISA session handler, we will automatically OPEN and CLOSE the instrument
  1036.     ; session for the user.
  1037.     ; This is of course slower if you need to do more than one GPIB call but much
  1038.     ; more convenient for short tests
  1039.     $f_close_session_before_return = 1
  1040.     $h_session = _viOpen($h_session)
  1041.   EndIf
  1042.   
  1043.   ; errStatus = _viSetAttribute ($h_session, $VI_ATTR_TMO_VALUE, $timeout_value);
  1044.   ; signed int viGpibControlREN (unsigned long, int, int);
  1045.   Local $a_results
  1046.   $a_results = DllCall("visa32.dll", "int","viSetAttribute", "int",$h_session, "int", $i_attribute, "int",$i_value)
  1047.   If @error <> 0 Then
  1048.     ; Could not open VISA (visa32.dll)
  1049.     ;MsgBox(16,"_viSetAttribute - DllCall error","Could not open VISA (visa32.dll)")
  1050.     Return -1
  1051.   EndIf
  1052.   Local $errStatus = $a_results[0]
  1053.   If $errStatus <> 0 Then
  1054.     ; Could not set attribute of VISA instrument/resource
  1055.     SetError(1)
  1056.     ;MsgBox(16,"VISA error","Could not set attribute of VISA instrument/resource: " & $h_session)
  1057.     Return $errStatus
  1058.   EndIf
  1059.   
  1060.   If $f_close_session_before_return == 1 Then
  1061.     _viClose($h_session)
  1062.   EndIf
  1063.   
  1064.   Return 0
  1065. EndFunc
  1066.  
  1067.  
  1068. ;===============================================================================
  1069. ;
  1070. ; Description:      Go To Local mode (uses _viGpibControlREN)
  1071. ;                   Instruments that accept this command will exit the "Remote
  1072. ;                   Control mode" and go to "Local mode"
  1073. ;                   If the instrument is already in "Local mode" this is simply
  1074. ;                   ignored.
  1075. ;                   Normally, if an instrument does not support this command it
  1076. ;                   will simply stay in the "Remote Control mode"
  1077. ; Syntax:           _viGTL($h_session)
  1078. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session
  1079. ;                   handle (INTEGER). Look the explanation in _viExecCommand
  1080. ;                   (you can find it above)
  1081. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  1082. ;                   visa32.dll is in {WINDOWS}\system32)
  1083. ;                   For GPIB communication a GPIB card (such as a National Instruments
  1084. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  1085. ;                   This function always sets @error to 1 in case of error
  1086. ; Return Value(s):  On Success - Returns 0
  1087. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  1088. ;                                or a NON ZERO value representing the VISA
  1089. ;                                error code (see the VISA programmer's guide)
  1090. ;                   This function always sets @error to 1 in case of error
  1091. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  1092. ; Note(s):          None
  1093. ;
  1094. ;===============================================================================
  1095. Func _viGTL($h_session)
  1096.   Return _viGpibControlREN($h_session, $VI_GPIB_REN_ADDRESS_GTL)
  1097. EndFunc
  1098.  
  1099.  
  1100. ;===============================================================================
  1101. ;
  1102. ; Description:      GPIB BUS "reset" (uses _viGpibControlREN)
  1103. ;                   Use this function when the GPIB BUS gets stuck for some reason.
  1104. ;                   You might be lucky and resolve the problem by calling this
  1105. ;                   function
  1106. ; Syntax:           _viGpibBusReset()
  1107. ; Parameter(s):     None
  1108. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  1109. ;                   visa32.dll is in {WINDOWS}\system32)
  1110. ;                   For GPIB communication a GPIB card (such as a National Instruments
  1111. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  1112. ; Return Value(s):  On Success - Returns 0
  1113. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  1114. ;                                or a NON ZERO value representing the VISA
  1115. ;                                error code (see the VISA programmer's guide)
  1116. ;                   This function always sets @error to 1 in case of error
  1117. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  1118. ; Note(s):          None
  1119. ;
  1120. ;===============================================================================
  1121. Func _viGpibBusReset()
  1122.   Return _viGpibControlREN("GPIB0::INTFC", $VI_GPIB_REN_DEASSERT)
  1123. EndFunc
  1124.  
  1125.  
  1126. ;===============================================================================
  1127. ;
  1128. ; Description:      Control the VISA REN bus line
  1129. ; Syntax:           _viGpibControlREN ($h_session, $i_mode)
  1130. ; Parameter(s):     $h_session - A VISA descriptor (STRING) OR a VISA session
  1131. ;                   handle (INTEGER). Look the explanation in _viExecCommand
  1132. ;                   (you can find it above)
  1133. ;                   $i_mode - The mode into which the REN line of the GPIB bus
  1134. ;                   will be set.
  1135. ;                   Modes are defined in the VISA library. Look at the top of
  1136. ;                   this file for valid modes
  1137. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  1138. ;                   visa32.dll is in {WINDOWS}\system32)
  1139. ;                   For GPIB communication a GPIB card (such as a National Instruments
  1140. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  1141. ; Return Value(s):  On Success - Returns 0
  1142. ;                   On Failure - Returns -1 if the VISA DLL could not be open
  1143. ;                                or a NON ZERO value representing the VISA
  1144. ;                                error code (see the VISA programmer's guide)
  1145. ;                   This function always sets @error to 1 in case of error
  1146. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  1147. ; Note(s):          This function is used by _viGTL and _viGpibBusReset
  1148. ;
  1149. ;===============================================================================
  1150. Func _viGpibControlREN ($h_session, $i_mode)
  1151.   Local $f_close_session_before_return = 0 ; By default do not close the session at the end
  1152.   If IsString($h_session) Then
  1153.     ; When we pass a string, i.e. a VISA ID (like GPIB::20::0, for instance) instead
  1154.     ; of a VISA session handler, we will automatically OPEN and CLOSE the instrument
  1155.     ; session for the user.
  1156.     ; This is of course slower if you need to do more than one GPIB call but much
  1157.     ; more convenient for short tests
  1158.     $f_close_session_before_return = 1
  1159.     $h_session = _viOpen($h_session)
  1160.   EndIf
  1161.  
  1162.   ; errStatus = viGpibControlREN ($h_session, VI_GPIB_REN_ASSERT);
  1163.   ; signed int viGpibControlREN (unsigned long, int);
  1164.   Local $a_results
  1165.   $a_results = DllCall("visa32.dll", "int","viGpibControlREN", "int",$h_session, "int", $i_mode)
  1166.   If @error <> 0 Then
  1167.     ; Could not open VISA (visa32.dll)
  1168.     ;MsgBox(16,"_viGpibControlREN - DllCall error","Could not open VISA (visa32.dll)")
  1169.     Return -1
  1170.   EndIf
  1171.   Local $errStatus = $a_results[0]
  1172.   If $errStatus <> 0 Then
  1173.     ; Could not send to Local VISA instrument/resource
  1174.     SetError(1)
  1175.     ;MsgBox(16,"VISA error","Could not send to Local VISA instrument/resource: " & $h_session)
  1176.     Return $errStatus
  1177.   EndIf
  1178.  
  1179.   If $f_close_session_before_return == 1 Then
  1180.     _viClose($h_session)
  1181.   EndIf
  1182.  
  1183.   Return 0
  1184. EndFunc
  1185.  
  1186.  
  1187. ;===============================================================================
  1188. ;
  1189. ; Description:      Interactive VISA control.
  1190. ;                   This function lets you easily test your SCPI commands 
  1191. ;                   interactively.
  1192. ;                   It also lets you save these commands into a file
  1193. ;                   Simply answer the questions (Device Descriptor, SCPI command
  1194. ;                   and timeout).
  1195. ;                   * If you click Cancel on the 1st question the interactive
  1196. ;                     control ends.
  1197. ;                   * If you click Cancel to the other queries, you will go back
  1198. ;                     to the Device Descriptor question.
  1199. ; Syntax:           _viInteractiveControl($s_command_save_filename = "")
  1200. ; Parameter(s):     $s_command_save_filename - This is an OPTIONAL PARAMETER
  1201. ;                     The name of the file in which the SCPI commands issued 
  1202. ;                     during the interactive session will be saved.
  1203. ;                     If no filename is passed the funcion asks the user if and 
  1204. ;                     where does the user want to save the issued commands.
  1205. ; Requirement(s):   The VISA libraries must be installed (you can check whether
  1206. ;                   visa32.dll is in {WINDOWS}\system32)
  1207. ;                   For GPIB communication a GPIB card (such as a National Instruments
  1208. ;                   NI PCI-GPIB card or an Agilent 82350B PCI High-Performance GPIB card
  1209. ; Return Value(s):  The list of AutoIt3 VISA commands that were executed by the tool.
  1210. ;                   This is the same list that is saved into the file if the a
  1211. ;                   filename is passed to the function.
  1212. ; Author(s):        Angel Ezquerra <ezquerra at gmail dot com>
  1213. ; Note(s):          Type "FIND" in the Device Descriptor query to perform a GPIB
  1214. ;                   search
  1215. ;
  1216. ;===============================================================================
  1217. Func _viInteractiveControl($s_command_save_filename = "")
  1218.   ;- Define variables, set their default values
  1219.   Local $s_vi_id = "FIND" ; "GPIB::1::0" ; Default values
  1220.   Local $s_command = "*IDN?"
  1221.   Local $i_timeout_ms = 10000 ; ms
  1222.   Local $s_answer = ""
  1223.   Local $a_descriptor_list[1], $a_idn_list[1] ; The results of the GPIB search
  1224.   ; The variables used to save the commands to a file
  1225.   Local $s_empty_command_list = "#include <Visa.au3>" & @CR & @CR & "Local $s_answer" & @CR & @CR
  1226.   Local $s_new_command = ""
  1227.   Local $s_command_list = $s_empty_command_list
  1228.   
  1229.   ;- Loop until the user Cancles the Instrument Device Descriptor request
  1230.   While 1
  1231.     ;- Request the Instrument Descriptor (reuse the previous descriptor)
  1232.     $s_vi_id = InputBox("Instrument Device Descriptor", _
  1233.       "- Type the Instrument Device Descriptor (e.g. 'GPIB::1::0' or 'GPIB::1::INSTR')" & _
  1234.       @CR & @CR & _
  1235.       "- Type FIND to perform a GPIB search" & _
  1236.       @CR & @CR & _
  1237.       "- Click CANCEL to STOP the VISA interactive tool", $s_vi_id, "", 500, 250)
  1238.     If @error == 1 Then
  1239.       ; The Cancel button was pushed -> Exit the loop
  1240.       ExitLoop
  1241.     EndIf
  1242.     If StringUpper($s_vi_id) == "FIND" Then
  1243.       ; Perform a GPIB search
  1244.       $s_command_list = $s_command_list & _
  1245.         "Local $a_descriptor_list[1], $a_idn_list[1]" & @CR & @CR & _
  1246.         "_viFindGpib($a_descriptor_list, $a_idn_list, 1)" & @CR & @CR
  1247.       _viFindGpib($a_descriptor_list, $a_idn_list, 1)
  1248.       If UBound($a_descriptor_list) >= 1 Then
  1249.         ; If an instrument was found, use the 1st found instrument as the default
  1250.         ; for the next query
  1251.         $s_vi_id = $a_descriptor_list[0]
  1252.       EndIf
  1253.       ContinueLoop
  1254.     EndIf
  1255.     
  1256.     ;- Request the command that must be executed (reuse the previous command)
  1257.     $s_answer = InputBox("SCPI command","Type the SCPI command", $s_command)
  1258.     If @error == 1 Then
  1259.       ; The Cancel button was pushed -> Restart the process
  1260.       ContinueLoop
  1261.     EndIf
  1262.     $s_command = $s_answer ; We got a valid command
  1263.     
  1264.     ;- Request the timeout (reuse the previous timout)
  1265.     $s_answer = InputBox("Command Timeout (ms)", _
  1266.       "Type the command timeout (in milliseconds)", $i_timeout_ms)
  1267.     If @error == 1 Then
  1268.       ; The Cancel button was pushed -> Restart the process
  1269.        ContinueLoop
  1270.     EndIf
  1271.     $i_timeout_ms = 0 + $s_answer ; We got a valid timeout
  1272.     
  1273.     ;- Add the command to the command list
  1274.     $s_new_command = '$s_answer = _viExecCommand("' & $s_vi_id & '", "' & _
  1275.       $s_command & '", ' & $i_timeout_ms & ')'
  1276.     $s_command_list = $s_command_list & $s_new_command & @CR
  1277.     
  1278.     ;- Execute the requested command
  1279.     $s_answer = _viExecCommand($s_vi_id, $s_command, $i_timeout_ms)
  1280.  
  1281.     If IsString($s_answer) Then
  1282.       ;- The command was a query and the instrument answered it
  1283.       ; Show the query results
  1284.       MsgBox(64,"Query results", "[" & $s_vi_id & "] " & $s_command & " -> " & $s_answer)
  1285.     ElseIf $s_answer == 0 Then
  1286.       ;- The command was not a query but it was exuced successfully
  1287.       MsgBox(64, "Command result", "The command:" & @CR & @CR & _
  1288.         "         '" & $s_command & "'" & @CR & @CR & _
  1289.         "was SUCCESSFULLY executed on the device: " & @CR & @CR & _
  1290.         "         '" & $s_vi_id & "'")
  1291.     ElseIf $s_answer < 0 Then
  1292.       ;- There was an error -> Show an error message
  1293.       $s_answer = MsgBox(16 + 4,"VISA Error", _
  1294.         "There was a VISA error when executing the command:" & @CR & @CR & _
  1295.         "'" & $s_command & "'" & @CR & @CR & "on the Device '" & $s_vi_id & "'" & _
  1296.         @CR & @CR & _
  1297.         "Do you want to RESET the GPIB bus before continuing?")
  1298.       If $s_answer == 6 Then ; Yes
  1299.         _viGpibBusReset()
  1300.         MsgBox(0,"VISA","The GPIB bus was RESET!")
  1301.       EndIf
  1302.     EndIf
  1303.   WEnd
  1304.   
  1305.   If $s_command_list <> $s_empty_command_list Then
  1306.     ; If at least one command was issued we might want to save the file
  1307.     
  1308.     If $s_command_save_filename == "" Then
  1309.       ; The user did not pass an explicit file name in which to save the commands
  1310.       ; Ask him if he wants to save the m now
  1311.       $s_answer = MsgBox(64 + 4, "Save commands to AutoIt3 script?", _
  1312.         "Do you want to save the commands that you issued into an AutoIt3 script?")
  1313.       If $s_answer == 6 Then ; Yes
  1314.         $s_command_save_filename = FileSaveDialog("Save as...", @ScriptDir, _
  1315.           "AutoIt3 scripts (*.au3)", 16, "visa_log.au3")
  1316.         If @error <> 0 Then
  1317.           $s_command_save_filename = ""
  1318.         EndIf
  1319.       EndIf
  1320.     EndIf
  1321.     
  1322.     If $s_command_save_filename <> "" Then
  1323.       ;- Save the SCPI commands into a file
  1324.       If FileExists($s_command_save_filename) Then
  1325.         ; Delete the save file if it already exists
  1326.         FileDelete($s_command_save_filename)
  1327.       EndIf
  1328.       FileWrite($s_command_save_filename, $s_command_list)
  1329.     EndIf
  1330.   EndIf
  1331.   
  1332.   Return $s_command_list ; Return the list of executed commands
  1333. EndFunc
  1334.